import java.util.logging.Logger;
import src.de.checker.hochzeit.util.*;
import src.de.checker.hochzeit.domain.util.*;
import src.de.checker.hochzeit.domain.user.*;
import src.de.checker.hochzeit.domain.ideen.*;
import src.de.checker.hochzeit.domain.pinnwand.*;
import src.de.checker.hochzeit.konstanten.*
import com.google.appengine.api.datastore.*
import com.google.appengine.api.blobstore.BlobKey
import static com.google.appengine.api.datastore.FetchOptions.Builder.*

Logger log = Logger.getLogger('PinnwandController');

if(session.getAttribute(Konstanten.SESSION_USER) != null)
{
	def user = session.getAttribute(Konstanten.SESSION_USER)


	if(params?.index ==~ /(?i)true/)
	{
		index()
	}
	if(params?.create ==~ /(?i)true/)
	{
		create()
	}
	if(params?.delete ==~ /(?i)true/)
	{
		delete()
	}
	if(params?.update ==~ /(?i)true/)
	{
		update()
	}
}
private void index()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	if(!params.max)
		params.max = 5
	if(!params.offset)
		params.offset = 0
		
	def m = (new Integer(params.max)).intValue()
	def o = (new Integer(params.offset)).intValue()
	
	def query = new Query(Konstanten.PINNWAND)
	query.addSort("datum", Query.SortDirection.DESCENDING)
	query.addFilter("hochzeit", Query.FilterOperator.EQUAL, myuser.feier)
	PreparedQuery preparedQuery = datastore.prepare(query)
 	def entities = preparedQuery.asList( withLimit(m).offset(o) )
	//def entities = preparedQuery.asList( withLimit(100))
	request['list'] = entities
	def all = preparedQuery.countEntities();
	request['size'] = all
	request['max'] = m
	request['offset'] = o
	
    forward '/pinnwand/uebersicht.gtpl'
}
private void create()
{
	if(params.nachricht && !params.nachricht.equals(''))
	{
		try
		{
			def user = session.getAttribute(Konstanten.SESSION_USER)
			Pinnwand v = new Pinnwand();
			v.datum = Datehelper.getNow()
			v.user = user.key
			v.nachricht = params.nachricht
			v.von = user.anzeigename
			v.hochzeit = user.feier 
			
			Entity e2 = v as Entity
			e2.save()
			
			def pquery = new Query(Konstanten.PINNWAND)
    		pquery.addFilter("hochzeit", Query.FilterOperator.EQUAL, user.feier)
    		PreparedQuery ppreparedQuery = datastore.prepare(pquery)
    	 	int anzahl = ppreparedQuery.countEntities() 
    	 	def myuser = session.getAttribute(Konstanten.SESSION_USER)
    	 	myuser.anzahlLastPinnwand = anzahl
    	 	myuser.save()
    	 	
		}
		catch(Exception e)
		{
			log.warning(e.toString())
		}
	}
	index()
	
}
private void delete()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	Key k = null
	try
	{
		if(params.key)
			k = KeyFactory.stringToKey(params.key)
		else
			log.warning("pinnwand.delete(): params.key ist nicht gesetzt")
	}
	catch(Exception e)
	{
		String message = 'Es wurde ein Pinnwand-Eintrag zu löschen, den es nicht gibt. params.key: '+params.key 
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		log.warning(e.toString())
		log.warning("pinnwand.delete(): Pinnwand-Eintrag nicht gefunden zum löschen. Benutzer der gesucht hat: "+myuser+" params: "+params)
	}
	try
	{
		if(k != null)
		{
			def idee = datastore.get(k);
			if(idee.user == myuser.key)
			{
				log.info ('Lösche Pinnwand-Eintrag: '+idee+' [Gelöscht von: '+myuser+"]")
				String message = 'Pinnwand-Eintrag gelöscht: '+idee.key
				createTracer(Konstanten.TRACER_DELETE , message)
				idee.delete()
			}
			else
			{
				String message = 'Versuch einen Pinnwand-Eintrag zu löschen, der nicht der eigene ist: '+idee.key
				createTracer(Konstanten.TRACER_VERBOTEN, message)
				log.warning ('Versuch den Vorschlag zu Löschen: '+idee+' [Versuch von: '+session.user+", ist aber nicht der Eigentümer!]")
			}
		}
	}
	catch(Exception e)
	{
		log.warning(e.toString())
	}
	redirect "/pinnwand"
}
private void update()
{
	def myuser = session.getAttribute(Konstanten.SESSION_USER)
	Key k = null
	try
	{
		if(params.key)
			k = KeyFactory.stringToKey(params.key)
		else
			log.warning("pinnwand.update(): params.key ist nicht gesetzt")
	}
	catch(Exception e)
	{
		String message = 'Es wurde ein Pinnwand-Eintrag zu updaten, den es nicht gibt. params.key: '+params.key 
		createTracer(Konstanten.TRACER_VERBOTEN, message)
		log.warning(e.toString())
		log.warning("pinnwand.update(): Pinnwand-Eintrag nicht gefunden zum updaten. Benutzer der gesucht hat: "+myuser+" params: "+params)
	}
	try
	{
		if(k != null)
		{
			def idee = datastore.get(k);
			
			if(idee.user == myuser.key)
			{
				log.info ('Update Pinnwand-Eintrag vorher: '+idee+' [Update von: '+myuser+"]")
				idee.bearbeitet = Datehelper.getNow()
				idee.nachricht = params.nachrichtneu
				idee.save()
				String message = 'Pinnwand-Eintrag aktualisiert: '+idee.key
				createTracer(Konstanten.TRACER_UPDATE , message)
				log.info ('Update Pinnwand-Eintrag nachher: '+idee+' [Update von: '+myuser+"]")
			}
			else
			{
				String message = 'Versuch einen Pinnwand-Eintrag zu updaten, der nicht der eigene ist: '+idee.key
				createTracer(Konstanten.TRACER_VERBOTEN, message)
				log.warning ('Versuch einen Pinnwand-Eintrag zu aktualisieren: '+idee+' [Versuch von: '+myuser+", ist aber nicht der Eigentümer!]")
			}
		}
	}
	catch(Exception e)
	{
		log.warning(e.toString())
	}
	redirect "/pinnwand?offset=${params.offset}"
}
private void createTracer(String message)
{
	createTracer(Konstanten.TRACER_FORGOT, message);
}
private void createTracer(String type, String message) {
	try
	{
		def myuser = session.getAttribute(Konstanten.SESSION_USER);

		Tracer t = new Tracer()
	    t.ipadresse = request.getRemoteAddr()
	    t.user = myuser.key
	    t.type = type
	    t.nachricht = message
	    t.datum = Datehelper.getNow()
	    Entity e2 = t as Entity
		e2.save()
	}
	catch(Exception e)
	{
		
	}
}